home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
wstype
/
source
/
optparse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-18
|
4KB
|
228 lines
/*** [optparse.c]
*
* 起動時オプション解析 (C)ささがわ
*
* For GNU C Compiler (GCC) Version 1.39
*
***/
#include <string.h>
#include <stdlib.h>
#include "others.h"
#define OPT '/'
#define OPTN 15
static int argc;
static char **argv;
static const char *opt_name[OPTN] = {
"tabm", "crm", "tab", "lg", "lc",
"bg-tiff", "bg-tile", "bg-beta",
"wa-beep", "wa-pcm", "m",
"fcap", "fsort", "fwide", "scspd"
};
static const char opt_n[OPTN] = {
1, 1, 1, 1, 1,
1, 2, 1,
0, 1, 0,
0, 1, 0, 1
};
static int Next(int);
void OPT_init(int ac, char *av[]) {
argc = ac;
argv = av;
}
static int Next(int finit) {
int i, r;
char *p;
static int no;
if (finit) {
no = 1;
return 0;
} else if ((r = no++) >= argc)
return -1;
if (argv[r][0] == OPT && strlen(argv[r]) >= 2) {
p = &argv[r][1];
for (i = 0; i < OPTN; i++) {
if (!stricmp(p, opt_name[i])) {
no += opt_n[i];
break;
}
}
}
if (no - 1 >= argc)
return -1;
else
return r;
}
void OPT_filew(char *wide, char *cap, char *sort) {
int i;
char *p;
*wide = 0;
*cap = 0;
*sort = 0;
Next(1);
while ((i = Next(0)) >= 0) {
if (argv[i][0] != OPT || strlen(argv[i]) < 2)
continue;
p = &argv[i][1];
if (!stricmp(p, opt_name[11])) {
*cap = 1;
} else if (!stricmp(p, opt_name[12])) {
*sort = atoi(argv[i + 1]);
if (*sort < 0 || 3 < *sort)
*sort = 0;
} else if (!stricmp(p, opt_name[13])) {
*wide = 1;
}
}
return;
}
int OPT_BackG(char *path, int *no) {
int i, ret = -1;
char *p;
path[0] = '\0';
*no = 0;
Next(1);
while ((i = Next(0)) >= 0 && ret < 0) {
if (argv[i][0] != OPT || strlen(argv[i]) < 2)
continue;
p = &argv[i][1];
if (!stricmp(p, opt_name[5])) {
ret = 0;
strncpy(path, argv[i + 1], 89);
break;
} else if (!stricmp(p, opt_name[6])) {
ret = 1;
strncpy(path, argv[i + 1], 89);
*no = atoi(argv[i + 2]);
break;
} else if (!stricmp(p, opt_name[7])) {
ret = 2;
*no = atoi(argv[i + 1]);
break;
}
}
path[89] = '\0';
if (ret < 0)
ret = 2;
return ret;
}
int OPT_WarnS(char *path) {
int i, ret = 0;
char *p;
path[0] = '\0';
Next(1);
while ((i = Next(0)) >= 0 && ret == 0) {
if (argv[i][0] != OPT || strlen(argv[i]) < 2)
continue;
p = &argv[i][1];
if (!stricmp(p, opt_name[9])) {
ret = 1;
strncpy(path, argv[i + 1], 89);
break;
} else if (!stricmp(p, opt_name[8])) {
ret = 2;
break;
}
}
path[89] = '\0';
return ret;
}
int OPT_Cons(void) {
int i, r = 0;
Next(1);
while ((i = Next(0)) >= 0) {
if (argv[i][0] == OPT && strlen(argv[i]) >= 2 && !stricmp(&argv[i][1], opt_name[10])) {
r = 1;
break;
}
}
return r;
}
int OPT_Scroll(void) {
int i, r = -1;
Next(1);
while ((i = Next(0)) >= 0) {
if (argv[i][0] == OPT && strlen(argv[i]) >= 2 && !stricmp(&argv[i][1], opt_name[14])) {
r = atoi(argv[i + 1]);
break;
}
}
return r;
}
int OPT_txt_n(void) {
int i, ret = 0;
Next(1);
while ((i = Next(0)) >= 0) {
if (argv[i][0] != OPT)
ret++;
}
Next(1);
return ret;
}
const char *OPT_txt(void) {
int i;
const char *ret = NULL;
while ((i = Next(0)) >= 0) {
if (argv[i][0] != OPT) {
ret = argv[i];
break;
}
}
return ret;
}
void OPT_disp(short *par) {
int i;
char *p;
Next(1);
while ((i = Next(0)) >= 0) {
int a;
if (argv[i][0] != OPT || strlen(argv[i]) < 2)
continue;
p = &argv[i][1];
for (a = 0; a < 5; a++) {
if (!stricmp(p, opt_name[a])) {
par[a] = atoi(argv[i + 1]);
break;
}
}
}
return;
}